﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using static HomeWork.User;

namespace HomeWork
{


    sealed class User : Entity<int>, ISendMessage, IChat
    {
        private string _name; // 私有字段存储密码
        public String Name
        {
            get => _name;
            set
            {
                if (value.Contains("admin") || value.Contains("17bang") || value.Contains("管理员"))
                {
                    throw new ArgumentException("用户名不能包含'admin'或'17bang'或'管理员'。");
                }
                _name = value;
                //Console.WriteLine("设置了用户名：" + Name);
            }
        }

        private string _password; // 私有字段存储密码
        public String Password
        {
            get => _password;
            set
            {
                string pattern = "^(?=.*[A-Za-z])(?=.*[0-9])(?=.*[~!@#$%^&*()_+])[A-Za-z0-9~!@#$%^&*()_+]+$";
                if (value.Length < 6)
                {
                    throw new ArgumentOutOfRangeException(nameof(value), "密码长度太短");
                }
                else if (Regex.IsMatch(value, pattern))
                {
                    _password = value;
                    Console.WriteLine(Name + "设置了密码：" + Password);
                }
                else
                {
                    throw new ArgumentException("只能由大小写英语单词、数字和特殊符号（~!@#$%^&*()_+）三种字符组成，且每种字符至少包含一个");

                }
            }
        }
        public User InvitedBy { get; set; } //邀请人
        public int Bmoney { get; set; } //余额
        public IList<HelpMoney> HelpMoneys { get; set; } //帮帮币账户记录
        public IList<Problem> Problems { get; set; } //用户悬赏的问题
        public int origin { get; set; } //帮帮点：积分数量
        private TokenManager tokenManager; //权限管理器
        public enum Rank
        {
            Newbie,
            Regular,
            Active,
            Veteran,
            Elite
        }

        public User()
        {
            origin = 10; //默认积分为10
            _name = "游客"; //默认用户名为游客
            _password = "123456"; //默认密码为123456
            tokenManager = new TokenManager();//初始化权限管理器
        }

        public User(int id) : base(id) { } // 实现带参构造
                                           // 
                                           // 构造函数：初始化 ID 和 Name                                  
        public User(int id, string name) : base(id)
        {
            Name = name;
        }

        public static int Encourage(int origin, Rank rank)
        {
            switch (rank)
            {
                case Rank.Newbie:
                    origin += 5;
                    Console.WriteLine("一起帮周年庆，系统根据你的等级为你自动奖励5分");
                    break;

                case Rank.Regular:
                    origin += 10;
                    Console.WriteLine("一起帮周年庆，系统根据你的等级为你自动奖励10分");
                    break;

                case Rank.Active:
                    origin += 15;
                    Console.WriteLine("一起帮周年庆，系统根据你的等级为你自动奖励15分");
                    break;

                case Rank.Veteran:
                    origin += 25;
                    Console.WriteLine("一起帮周年庆，系统根据你的等级为你自动奖励20分");
                    break;

                case Rank.Elite:
                    origin += 25;
                    Console.WriteLine("一起帮周年庆，系统根据你的等级为你自动奖励25分");
                    break;

                default:
                    Console.WriteLine("未知用户等级，积分不变");
                    break;
            }
            return origin;
        }

        public void Register()
        {
            Console.WriteLine(Name + "开始注册，" + "密码：" + Password + "邀请人" + InvitedBy.Name);
        }

        public static void Login(
           string inputUsername, 
           string inputPassword,
            Action onSuccess,        // 成功回调：无参数，无返回值
            Action<string> onFailed // 失败回调：带一个string参数（错误信息），无返回值
        )
        {

            // 1. 参数检查（可选但建议）
            if (onSuccess == null) throw new ArgumentNullException(nameof(onSuccess));
            if (onFailed == null) throw new ArgumentNullException(nameof(onFailed));

            // 2. 你原有的登录验证逻辑（假设）
            //UserRepository users = new UserRepository();
            //User user = users.GetByName(inputUsername);

            string userMessage = "* 用户名不存在"; // 假设的失败信息[1](@ref)
            string errorMessage = "* 用户名或密码错误"; // 假设的失败信息[1](@ref)
           

            // 3. 根据验证结果调用相应的回调
            
            //if (user == null)
            //{
            //    onFailed(userMessage);
            //    return;
            //    // 执行成功处理逻辑
            //}
            //else if (user.Password != inputPassword)
            //{
            //    onFailed(errorMessage); // 执行失败处理逻辑，并传递错误信息
            //    return;
            //}
            //else
            //{
            //    onSuccess();
            //}
        }

        private bool ValidateCredentials(string username, string password)
        {
            return false;
        }

        void IChat.Send()
        {
            Console.WriteLine("send by chat");
        }

        void ISendMessage.Send()
        {
            Console.WriteLine("send by message");

        }
    }


}
